EventBridge ルールで CloudWatch Logs にイベントが出力されないときの対処方法
困っていた内容
EventBridge ルールのターゲットとして CloudWatch Logs を設定しています。
先日、イベントが生成され Invocations や TriggeredRules メトリクスも記録されましたが、CloudWatch Logs にイベントが出力されていませんでした。
なぜでしょうか?原因と対処法を教えてください。
なお、FailedInvocations メトリクスも記録され、デッドレターキューに次のメッセージ属性のメッセージが送信されていました。
NO_PERMISSIONS
ERROR_MESSAGE: Could not complete putLogEvents call for /aws/events/hato-CloudWatchLogs
どう対応すればいいの?
CloudWatch Logs のリソースベースポリシーを確認してください。
CloudWatch Logs のリソースベースポリシーを確認する方法を教えてください | DevelopersIO
EventBridge ルールのターゲットとして CloudWatch Logs を指定する場合、CloudWatch Logs のリソースベースポリシーにログ送信を許可するポリシーが必要です。アクションが許可されていない場合、イベントの出力に失敗し FailedInvocations メトリクスやデッドレターキューにメッセージが配信されます。
そのため、CloudWatch Logs に EventBridge からのアクションを許可するポリシーが含まれているか確認してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "TrustEventsToStoreLogEvent",
"Effect": "Allow",
"Principal": {
"Service": [
"events.amazonaws.com",
"delivery.logs.amazonaws.com"
]
},
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/events/*:*"
}
]
}
AWS CLI でポリシーを設定する
AWS CLI でポリシーを設定(作成/更新)する場合は次のコマンドを実行します。
※Resource
の AWS アカウント ID(123456789012
)は修正が必要です。
aws logs put-resource-policy \
--policy-name "TrustEventsToStoreLogEvents" \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "TrustEventsToStoreLogEvent",
"Effect": "Allow",
"Principal": {
"Service": [
"events.amazonaws.com",
"delivery.logs.amazonaws.com"
]
},
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/events/*:*"
}
]
}'
なお、AWS マネージメントコンソールから CloudWatch Logs を設定した場合は、自動的に上記のようなポリシーが設定されます。
また、CloudFormation からを設定する場合は、次のブログが参考になると思います。
参考資料
CloudWatch Logs がルールのターゲットである場合、EventBridge がログストリームを作成し、CloudWatch Logs がログエントリとしてイベントからテキストを保存します。EventBridge がログストリームを作成してイベントを記録するためには、EventBridge が CloudWatch Logs に書き込むことを可能にするリソースベースポリシーを CloudWatch Logs に含める必要があります。
AWS Management Console を使用して、CloudWatch Logs をルールのターゲットとして追加する場合、リソースベースのポリシーは自動的に作成されます。AWS CLI を使用してターゲットを追加し、ポリシーがまだ存在しない場合は、作成する必要があります。